In a typical storage area network (SAN), a target exposes persistent data storage spaces (e.g., a logical unit number (LUN), a namespace) to one or more initiators via a Fiber connection or a switching network. An initiator refers to an endpoint that initiates an interface session (e.g., a small computer system interface (SCSI) session) and sends a command (e.g., a SCSI command). A target refers to an endpoint that waits for an initiator's work requests and performs input/output (I/O) operations. In the context of a general computer architecture, an initiator may be referred to as a client, and a target may be referred to as a server. A single target may serve a plurality of initiators and provide the initiators with one or more LUNs.
A target may communicate with one or more initiators via a mutually agreed SAN protocol. Examples of the SAN protocol include, but are not limited to, Fibre Channel Protocol (FCP), parallel SCSI (pSCSI), Internet small computer system interface (iSCSI), HyperSCSI, Fibre Channel, Advanced Technology Attachment (ATA), Serial ATA (SATA), ATA over Ethernet (AoE), InfiniBand, and Non-Volatile Memory Express (NVMe) over Fabrics. The SAN protocol allows an initiator to send I/O commands to a target. Data storage devices of a data center may include a plurality of targets that may be physically and/or logically distributed over a storage area network. The SAN protocol consolidates the data storage devices into arrays of targets while providing an illusion to a host that the data storage devices appear to be locally attached.
Storage targets typically may expose the backend LUNs to multiple initiators via multiple connections. Each initiator can open one or more connections with a target and access one or more LUNs in the target. From an input/output (I/O) flow point of view, multiple synchronization points established in a data path can affect the I/O performance, especially when multiple sessions access multiple LUNs in parallel.
A data path in the frontend I/O stack may be split into a transport protocol layer and a SCSI core layer. Processing in the transport protocol is per-connection based, while processing in the SCSI core layer is per-LUN based. The processing in the transport layer includes issuing the I/O commands on a particular connection and completing them on that particular connection. The LUN processing in the core layer includes issuing I/O commands to a particular LUN and completing the I/O commands issued to the particular LUN. If the entire I/O path is executed in a thread context of the transport protocol layer, various synchronization points may be established at the LUN level as well as at the connection level, thus affecting the overall I/O performance. This is because the I/O context at the transport protocol layer is connection specific whereas the I/O context in SCSI core layer is LUN specific.